package jmine.tec.hydra.api;

import jmine.tec.hydra.codec.Decoder;
import jmine.tec.hydra.codec.Encoder;
import jmine.tec.hydra.domain.HydraSystem;
import jmine.tec.hydra.send.Sender;
import bancosys.tec.persist.Persistable;

/**
 * Especificação de integração para uma dada ação e um dado systema.
 * 
 * @author piercio
 */
public interface HydraSpecification extends Persistable {

    /**
     * @return a {@link IntegrationAction} dessa especificação.
     */
    String getAction();

    /**
     * @return o {@link HydraSystem} dessa especificação.
     */
    HydraSystem getSystem();

    /**
     * @return o {@link Encoder} responsável por tratar essa ação para esse sistema.
     */
    Encoder getEncoder();

    /**
     * @return o {@link Sender} reponsável por enviar a mensagem gerada.
     */
    Sender getSender();

    /**
     * @return o {@link Decoder} responsável por tratar as mensagens e gerar a lista de serviços correspondente.
     */
    Decoder getDecoder();

    /**
     * @return retorna true caso esta especification defina um sender
     */
    boolean hasSender();

    /**
     * @return <code>true</code> caso a especificação esteja habilitada.
     */
    boolean isEnabled();

    /**
     * Habilita a especificação.
     */
    void enable();

    /**
     * Desabilita a especificação.
     */
    void disable();
}
